package com.example.chapter05;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.TimePicker;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Calendar;


/**
 * 时间选择功能的Activity
 * 功能：支持两种时间选择方式——界面内置的TimePicker控件、弹窗式的TimePickerDialog
 * 实现接口：
 * - View.OnClickListener：处理按钮的点击事件
 * - TimePickerDialog.OnTimeSetListener：处理弹窗选择时间后的结果回调
 */
public class TimePickerActivity extends AppCompatActivity implements View.OnClickListener, TimePickerDialog.OnTimeSetListener {

    // 声明界面中的时间选择控件（TimePicker）：用于在界面上直接手动选择时间
    private TimePicker tp_time;
    // 声明界面中的文本显示控件（TextView）：用于展示最终选择的时间结果
    private TextView tv_time;

    /**
     * Activity创建时的核心初始化方法（生命周期关键方法）
     * @param savedInstanceState 用于恢复Activity状态的Bundle对象（如屏幕旋转时保存数据）
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 加载当前Activity对应的布局文件（activity_time_picker.xml）
        // 作用：将XML中定义的控件（按钮、TimePicker、TextView）与当前Java代码关联
        setContentView(R.layout.activity_time_picker);

        // 给"确认"按钮（ID：btn_ok）设置点击监听器
        // this表示当前Activity（因实现了View.OnClickListener接口，可直接处理点击）
        findViewById(R.id.btn_ok).setOnClickListener(this);
        // 给"弹出时间对话框"按钮（ID：btn_time）设置点击监听器
        findViewById(R.id.btn_time).setOnClickListener(this);

        // 获取布局中的TimePicker控件实例（ID：tp_time），后续用于读取用户选择的时间
        tp_time = findViewById(R.id.tp_time);
        // 设置TimePicker为24小时制显示
        // 若不设置，默认可能为12小时制（带AM/PM），这里统一为24小时制更符合常见需求
        tp_time.setIs24HourView(true);

        // 获取布局中的TextView控件实例（ID：tv_time），后续用于显示选择的时间结果
        tv_time = findViewById(R.id.tv_time);
    }

    /**
     * 点击事件处理方法（View.OnClickListener接口的实现方法）
     * 所有设置了监听器的按钮（btn_ok、btn_time）被点击时，都会触发此方法
     * @param v 被点击的视图对象（这里特指两个按钮）
     */
    @Override
    public void onClick(View v) {
        // 获取被点击视图的ID（通过ID区分是哪个按钮被点击）
        int id = v.getId();

        // 分支1：若点击的是"确认"按钮（ID：btn_ok）
        if (id == R.id.btn_ok) {
            // 从TimePicker控件中读取用户选择的小时和分钟
            // getHour()：获取24小时制的小时（0-23）
            // getMinute()：获取分钟（0-59）
            // 用String.format拼接成"您选择的时间是XX时XX分"格式的文本
            String desc = String.format("您选择的时间是%d时%d分", tp_time.getHour(), tp_time.getMinute());
            // 将拼接好的时间文本设置到TextView中，展示给用户
            tv_time.setText(desc);
        }
        // 分支2：若点击的是"弹出时间对话框"按钮（ID：btn_time）
        else if (id == R.id.btn_time) {
            // 获取系统当前的日历实例（包含当前的年、月、日、时、分、秒等时间信息）
            // 作用：让弹窗默认显示当前系统时间，提升用户体验
            Calendar calendar = Calendar.getInstance();

            // 创建弹窗式的时间选择器（TimePickerDialog）
            // 参数说明：
            // 1. this：当前Activity的上下文（确保弹窗依附于当前页面）
            // 2. android.R.style.Theme_Holo_Light_Dialog：弹窗的样式（浅色主题，与系统风格统一）
            // 3. this：时间选择完成后的回调监听器（当前Activity实现了OnTimeSetListener接口）
            // 4. calendar.get(Calendar.HOUR_OF_DAY)：弹窗默认显示的小时（24小时制，取当前系统小时）
            // 5. calendar.get(Calendar.MINUTE)：弹窗默认显示的分钟（取当前系统分钟）
            // 6. true：是否启用24小时制（与TimePicker控件保持一致）
            TimePickerDialog dialog = new TimePickerDialog(this,
                    android.R.style.Theme_Holo_Light_Dialog,
                    this,
                    calendar.get(Calendar.HOUR_OF_DAY),
                    calendar.get(Calendar.MINUTE),
                    true);

            // 显示时间选择弹窗（调用后用户才能看到并操作弹窗）
            dialog.show();
        }
    }

    /**
     * 时间选择弹窗的结果回调方法（TimePickerDialog.OnTimeSetListener接口的实现方法）
     * 当用户在TimePickerDialog中选择完时间并点击"确定"后，会触发此方法
     * @param view 触发回调的时间选择器（弹窗内部的TimePicker，一般无需操作）
     * @param hourOfDay 用户在弹窗中选择的小时（24小时制，0-23）
     * @param minute 用户在弹窗中选择的分钟（0-59）
     */
    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        // 拼接用户选择的时间文本（格式与"确认"按钮的结果一致，保持显示统一）
        String desc = String.format("您选择的时间是%d时%d分", hourOfDay, minute);
        // 将结果文本设置到TextView中，展示给用户
        tv_time.setText(desc);
    }
}